package com.atguigu.gulimall.order.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.Query;
import com.atguigu.gulimall.order.dao.OrderDao;
import com.atguigu.gulimall.order.entity.OrderEntity;
import com.atguigu.gulimall.order.service.OrderService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.nio.channels.Channel;
import java.util.Map;

@Slf4j
@Service("orderService")
@RabbitListener(queues = {"hello.java.queue"})
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderEntity> page = this.page(
                new Query<OrderEntity>().getPage(params),
                new QueryWrapper<OrderEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * @RabbitListener(queues = {"hello.java.queue"}) 可以标注在类上和方法上
     * @RabbitHandler 只能标注在方法上
     * 理解：这样一个场景，同一个队列里接收不同类型的消息，就可以使用多个标有@RabbitHandler的方法处理
     *
     * @RabbitListener(queues = {"hello.java.queue"})
     * queues 用于监听哪一个队列中的消息，是一个数组
     * 参数
     * Message message 接收到的消息，包含消息头和消息体(我们想要的数据，但是它是一个字节数组，需要我们手动转换)
     * 如果发送消息是一个对象，可以使用对象进行接收，springboot 帮我们自动转换了
     * Channel channel 传递消息的通道
     * 场景：一个队列可以由很多方法进行监听，但是同一个消息，只能有一个客户端消费。
     * 一个消息处理完才会处理下一个消息
     */
    @RabbitHandler
    public void receiveMessage(Channel channel, Message message, OrderEntity orderEntity) {
        byte[] body = message.getBody();
        Object o = JSON.toJSON(body);
        MessageProperties messageProperties = message.getMessageProperties();
        log.debug("消息头的属性信息==" + messageProperties);
    }
}